﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SisGrafeno;

namespace SisGrafenoController
{

    public class DBConnection
    {
        public static int dbType = DAOFactory.SQLSERVER;
    }

    //Base de datos de Producto  <---------- つ ◕_◕ ༽つ
    public class ProductosDB
    {
        DAOFactory daoFactory = null;
        DAOProducto daoProducto = null;

        public ProductosDB()
        {
            daoFactory = DAOFactory.getDAOFactory(DBConnection.dbType);
            daoProducto = daoFactory.getDAOProducto(); //Polimorfismo
        }

        public List<Producto> Values
        {
            get { return daoProducto.queryAll(); }
        }
        public void Add(Producto p)
        {
            daoProducto.add(p);
        }
        public int Size
        {
            get { return daoProducto.count(); }
        }
        public void Delete(int id)
        {
            daoProducto.delete(id);
        }
        public void Update(Producto p)
        {
            daoProducto.update(p);
        }
        public Producto QueryById(int productoId)
        {
            return daoProducto.queryById(productoId);
        }
    }

    //Base de datos de Paquete  <---------- つ ◕_◕ ༽つ
    public class PaquetesDB
    {
        DAOFactory daoFactory = null;
        DAOPaquete daoPaquete = null;

        public PaquetesDB()
        {
            daoFactory = DAOFactory.getDAOFactory(DBConnection.dbType);
            daoPaquete = daoFactory.getDAOPaquete(); //Polimorfismo
        }
        public List<Paquete> Values
        {
            get { return daoPaquete.queryAll(); }
        }
        public void Add(Paquete c)
        {
            daoPaquete.add(c);
        }
        public int Size
        {
            get { return daoPaquete.count(); }
        }
        public void Delete(int id)
        {
            daoPaquete.delete(id);
        }
       /* public void Update(Paquete c)
        {
            daoPaquete.update(c);
        }*/
        public Paquete QueryById(int paqueteId)
        {
            return daoPaquete.queryById(paqueteId);
        }
    }

    //Base de datos de LineaProducto  <---------- つ ◕_◕ ༽つ
    public class LineaProductosDB
    {
        DAOFactory daoFactory = null;
        DAOLineaProducto daoLineaProducto = null;

        public LineaProductosDB()
        {
            daoFactory = DAOFactory.getDAOFactory(DBConnection.dbType);
            daoLineaProducto = daoFactory.getDAOLineaProducto(); //Polimorfismo
        }

        public List<LineaProducto> Values
        {
            get { return daoLineaProducto.queryAll(); }
        }
        public void Add(LineaProducto lp)
        {
            daoLineaProducto.add(lp);
        }
        public int Size
        {
            get { return daoLineaProducto.count(); }
        }
        public void Delete(int id)
        {
            daoLineaProducto.delete(id);
        }
        public void Update(LineaProducto lp)
        {
            daoLineaProducto.update(lp);
        }
        public LineaProducto QueryById(int cotizacionId)
        {
            return daoLineaProducto.queryByIdCotizacion(cotizacionId);
        }

    }

    //Base de datos de Cotizacion  <---------- つ ◕_◕ ༽つ
    public class CotizacionesDB
    {
        DAOFactory daoFactory = null;
        DAOCotizacion daoCotizacion = null;

        public CotizacionesDB()
        {
            daoFactory = DAOFactory.getDAOFactory(DBConnection.dbType);
            daoCotizacion = daoFactory.getDAOCotizacion(); //Polimorfismo
        }

        public List<Cotizacion> Values
        {
            get { return daoCotizacion.queryAll(); }
        }

        public List<Cotizacion> ValuesByCliente(int id)
        {
            return daoCotizacion.queryAllbyCliente(id);
        }

        public List<Cotizacion> ValuesByDate(DateTime s, DateTime f)
        {
            return daoCotizacion.queryByDateRange(s, f);
        }

        public void Add(Cotizacion c)
        {
            daoCotizacion.add(c);
        }
        public int Size
        {
            get { return daoCotizacion.count(); }
        }
        public void Delete(int id)
        {
            daoCotizacion.delete(id);
        }
        public void Update(Cotizacion c)
        {
            daoCotizacion.update(c);
        }
        public Cotizacion QueryById(int cotizacionId)
        {
            return daoCotizacion.queryById(cotizacionId);
        }

    }

    //Base de datos de Empleado  <---------- つ ◕_◕ ༽つ
    public class EmpleadosDB
    {
        DAOFactory daoFactory = null;
        DAOEmpleado daoEmpleado = null;

        public EmpleadosDB()
        {
            daoFactory = DAOFactory.getDAOFactory(DBConnection.dbType);
            daoEmpleado = daoFactory.getDAOEmpleado(); //Polimorfismo
        }
    }

    //Base de datos de Cliente  <---------- つ ◕_◕ ༽つ
    public class ClientesDB
    {
        DAOFactory daoFactory = null;
        DAOCliente daoCliente = null;

        public ClientesDB()
        {
            daoFactory = DAOFactory.getDAOFactory(DBConnection.dbType);
            daoCliente = daoFactory.getDAOCliente(); //Polimorfismo
        }
        public List<Cliente> Values
        {
            get { return daoCliente.queryAll(); }
        }
        public void Add(Cliente c)
        {
            daoCliente.add(c);
        }
        public int Size
        {
            get { return daoCliente.count(); }
        }
        public void Delete(int id)
        {
            daoCliente.delete(id);
        }
        public void Update(Cliente c)
        {
            daoCliente.update(c);
        }
        public Cliente QueryById(int customerId)
        {
            return daoCliente.queryById(customerId);
        }

    }
    //Base de datos de Paquetes  <---------- つ ◕_◕ ༽つ

    public class NotaCreditosDB
    {
        DAOFactory daoFactory = null;
        DAONotaCredito daoNotaCredito = null;

        public NotaCreditosDB()
        {
            daoFactory = DAOFactory.getDAOFactory(DBConnection.dbType);
            daoNotaCredito = daoFactory.getDAONotaCredito(); //Polimorfismo
        }
        /*
        public List<Cliente> Values
        {
            get { return daoCliente.queryAll(); }
        }
        
        public int Size
        {
            get { return daoCliente.count(); }
        }
        public void Delete(int id)
        {
            daoCliente.delete(id);
        }
        public void Update(Cliente c)
        {
            daoCliente.update(c);
        }
        */
        public NotaCredito QueryById(int notaCreditoId)
        {
            return daoNotaCredito.queryById(notaCreditoId);
        }
        public void Add(NotaCredito nc)
        {
            daoNotaCredito.add(nc);
        }

    }


    // --------------------------------------------  ୧༼ ͡◉ل͜ ͡◉༽୨
    public class MainController
    {
        private static ClientesDB clientes = new ClientesDB();
        private static CotizacionesDB cotizaciones = new CotizacionesDB();
        private static NotaCreditosDB notaCreditos = new NotaCreditosDB();
        private static ProductosDB productos = new ProductosDB();
        private static LineaProductosDB lineaProductos = new LineaProductosDB();
        private static PaquetesDB paquetes = new PaquetesDB();

        //MANTENIMIENTO DE CLIENTES
        //Ingresar nuevo cliente
        public static void addCliente(Cliente c)
        {
            clientes.Add(c);
        }
        public static Cliente getCustomerById(int id)
        {
            return clientes.QueryById(id);
        }
        public static List<Cliente> getAllCliente()
        {
            return clientes.Values;
        }
        public static int updateCustomer(Cliente c)
        {
            clientes.Update(c);
            return 1;
        }
        public static int deleteCustomer(int id)
        {
            clientes.Delete(id);
            return 1;
        }

        //MANTENIMINETO DE COTIZACIONES
        //Ingresar nueva cotizacion
        public static void addCotizacion(Cotizacion cot)
        {
            cotizaciones.Add(cot);
        }
        public static Cotizacion getCotizacionById(int id)
        {
            return cotizaciones.QueryById(id);
        }
        public static List<Cotizacion> getAllCotizacion()
        {
            return cotizaciones.Values;
        }
        public static List<Cotizacion> getAllCotizacionByCliente(int id)
        {
            return cotizaciones.ValuesByCliente(id);
        }
        public static int updateCotizacion(Cotizacion cot)
        {
            cotizaciones.Update(cot);
            return 1;
        }
        public static int deleteCotizacion(int id)
        {
            cotizaciones.Delete(id);
            return 1;
        }
        public static List<Cotizacion> getCotizacionByDateRange(DateTime s, DateTime f)
        {
            return cotizaciones.ValuesByDate(s,f);
        }

        //MANTENIMIENTO DE NOTACREDITO
        public static void addNotaCredito(NotaCredito nc)
        {
            notaCreditos.Add(nc);
        }
        public static NotaCredito getNotaCreditoById(int id)
        {
            return notaCreditos.QueryById(id);
        }

        //MANTENIMIENTO DE PRODUCTO
        public static void addProducto(Producto p)
        {
            productos.Add(p);
        }
        public static Producto getProductoById(int id)
        {
            return productos.QueryById(id);
        }
        public static List<Producto> getAllProducto()
        {
            return productos.Values;
        }
        public static int updateProducto(Producto p)
        {
            productos.Update(p);
            return 1;
        }
        public static int deleteProducto(int id)
        {
            productos.Delete(id);
            return 1;
        }

        //MANTENIMIENTO DE LINEAPRODUCTO
        public static void addLineaProducto(LineaProducto lp)
        {
            lineaProductos.Add(lp);
        }
        public static LineaProducto getLineaProductoById(int id)
        {
            return lineaProductos.QueryById(id);
        }
        public static List<LineaProducto> getAllLineaProducto()
        {
            return lineaProductos.Values;
        }
        public static int updateLineaProducto(LineaProducto lp)
        {
            lineaProductos.Update(lp);
            return 1;
        }
        public static int deleteLineaProducto(int id)
        {
            lineaProductos.Delete(id);
            return 1;
        }
        //Mantenimineto de paquetes y promociones
        public static List<Paquete> getAllPaquete()
        {
            return paquetes.Values;
        }
        public static void addPaquete(Paquete p)
        {
            paquetes.Add(p);
        }
        public static int deletePaquete(int id)
        {
            paquetes.Delete(id);
            return 1;
        }
    }
}
